package reversi.cliente;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import org.w3c.dom.Document;

import reversi.gui.PanelDeInformacionEste;
import reversi.gui.PanelDeInformacionOeste;
import reversi.gui.PanelDeInformacionSur;
import reversi.gui.PanelDeJuego;
import reversi.xml.XmlParser;

public class controlConexion extends Thread implements Runnable{
	
	/** Para lectura de datos del socket */
	private DataInputStream dataInput;

	/** Para escritura de datos en el socket */
	private static DataOutputStream dataOutput;

	XmlParser xml = new XmlParser();
	
	private ArrayList<String> datos = new ArrayList<String>(10) ;
	
	/**
	 * Contruye una instancia de esta clase, lanzando un hilo para atender al
	 * socket.
	 * 
	 * @param socket
	 *            El socket
	 * @param panel
	 *            El panel del usuario
	 */
	public controlConexion(Socket socket) {
		//this.panel = panel;
		try {
			/*
			 * Se inicializa el stream de entrada de datos que proviene del
			 * socket con el servidor
			 */
			dataInput = new DataInputStream(socket.getInputStream());
			/*
			 * Se inicializa el stream de salida de datos que proviene del
			 * socket con el servidor a través del cual se envíarán datos al
			 * servidor
			 */
			dataOutput = new DataOutputStream(socket.getOutputStream());
			
			/* Iniciamos esta clase que implementa Runnable */
			//Thread hilo = new Thread(this);
			//hilo.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void enviar(String mensaje){
		try {
			dataOutput.writeUTF(mensaje);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * Recoge el texto del panel y lo env�a por el socket. El panel llamar� a
	 * este m�todo cuando el usuario escriba algo y pulse el bot�n de "enviar" o
	 * pulse "enter" sobre el textfield.
	 */
	
	@SuppressWarnings("deprecation")
	public void detenerHilo()
	{
		this.stop();
	}
	/**
	 * Metodo run para antender al socket. 
	 */
	public void run() {
		try {
			while (true) {
				/*
				 * Cada vez que el servidor escriba algo en el socket, se
				 * recibirá por el dataInput. Como sabemos que se están pasando
				 * tipos de dato String utilizamos el método análogo readUTF
				 * para leer Strings con el encoding UTF-8
				 */
				//se guarda lo que se recibe a traves del socket 
				String texto = dataInput.readUTF();
				//se pasa a formato xml lo almacenado en texto
				Document textoXml = xml.string2DOM(texto);
				//se obtiene del xml los datos, y se guarda en un vector
				datos=xml.getDatos(textoXml);
				//si el primer elemento es respuesta
				if(datos.get(0).equalsIgnoreCase("registrarse")){
					//si el segundo elemento es registrado o conectado
					if(datos.get(1).equalsIgnoreCase("si") ){
						PanelDeInformacionOeste.deshabilitarPanelOeste();
						JOptionPane.showMessageDialog(null, "Te has registrado, tu sesion empieza");
						//PanelDeInformacionEste.habilitarPanelEste();
					}else{
						JOptionPane.showMessageDialog(null, "Ya existe un usuario con ese nombre");
					}
					
				}else if(datos.get(0).equalsIgnoreCase("conectarse")){
					if(datos.get(1).equalsIgnoreCase("si")){
						PanelDeInformacionOeste.deshabilitarPanelOeste();
						JOptionPane.showMessageDialog(null, "Te has conectado, tu sesion empieza");
						//PanelDeInformacionEste.habilitarPanelEste();
					}else{
						JOptionPane.showMessageDialog(null, "Nombre de usuario y contraseña no coinciden");
					}
					
				//si el primer elemento es actualizar
				}else if(datos.get(0).equalsIgnoreCase("actualizar")){
					PanelDeInformacionEste.actualizarLista(datos.get(1));
					
				//si el primer elemento es empezar, se recibe una invitacio
				}else if(datos.get(0).equalsIgnoreCase("empezar")){
					//si el tercer elemento es si, respuesta a la invitacion
					if(datos.get(2).equalsIgnoreCase("si") ){
						JOptionPane.showMessageDialog(null, datos.get(1)+" acepta jugar, la partida empieza");
						PanelDeJuego.ponerRival(datos.get(1));
						
						//Envia un mensaje al servidor para establecer mi estado a ocupado
						texto=xml.crearXml("ocupado",PanelDeInformacionOeste.getUsuario(), "si");
						controlConexion.enviar(texto);
						
						if(datos.get(3).equalsIgnoreCase("verdes")){
							PanelDeInformacionSur.ponerColor("Negras");
							PanelDeJuego.ponerMiTurno("negras");
						}else if(datos.get(3).equalsIgnoreCase("negras")){
							PanelDeInformacionSur.ponerColor("Verdes");
							PanelDeJuego.ponerMiTurno("verdes");
						}
					//si el tercer elemento es no, respuesta a la invitacion
					}else if(datos.get(2).equalsIgnoreCase("no")){
						JOptionPane.showMessageDialog(null, datos.get(1)+" no acepta jugar, la partida no empieza");
						
					//si se recibe la invitacion, por primera vez
					}else{
						int mc = JOptionPane.QUESTION_MESSAGE;
						int bc = JOptionPane.YES_NO_OPTION;
						int ch = JOptionPane.showConfirmDialog (null, datos.get(1)+" desea empezar una partida,\n" +
																"tu seras las fichas "+datos.get(2)+", estas de acuerdo?",
																"Solicitud de partida", bc, mc);
						if (ch == 0){
							PanelDeJuego.ponerRival(datos.get(1));
							PanelDeInformacionEste.setRival(datos.get(1));
							
							//Envia un mensaje al servidor para establecer mi estado a ocupado
							texto=xml.crearXml("ocupado",PanelDeInformacionOeste.getUsuario(), "si");
							controlConexion.enviar(texto);
							
							if(datos.get(2).equalsIgnoreCase("verdes")){
								PanelDeInformacionSur.ponerColor("Verdes");
								PanelDeJuego.ponerMiTurno("verdes");
							}else if(datos.get(2).equalsIgnoreCase("negras")){
								PanelDeInformacionSur.ponerColor("Negras");
								PanelDeJuego.ponerMiTurno("negras");
							}
							
							texto=xml.crearXml( "empezar",datos.get(1),"si",datos.get(2) );
						}else{
							texto=xml.crearXml( "empezar",datos.get(1),"no"," " );
						}
						enviar(texto);
					}
					
				}else if(datos.get(0).equalsIgnoreCase("jugada")){
					if( PanelDeJuego.validarJugada(Integer.parseInt(datos.get(1)),
							Integer.parseInt(datos.get(2))) > 0 ){
						PanelDeJuego.hacerJugada(Integer.parseInt(datos.get(1)),
								Integer.parseInt(datos.get(2)));
						PanelDeInformacionSur.sumarFichas(PanelDeJuego.obtenerMatrizDeBotones());
						PanelDeJuego.cambiarTurno();
					}
				}else if(datos.get(0).equalsIgnoreCase("terminar")){
					JOptionPane.showMessageDialog(null, datos.get(1)+" ya no desea jugar\n " +
													"Has "+datos.get(2));
					PanelDeInformacionEste.setRival("NOMBRE DEL RIVAL");
					PanelDeJuego.resetearTablero();
					PanelDeInformacionSur.resetearPanel();
					
					//Envia un mensaje al servidor para establecer mi estado a ocupado
					texto=xml.crearXml("ocupado",PanelDeInformacionOeste.getUsuario(), "no");
					controlConexion.enviar(texto);
					
				
				}else if(datos.get(0).equalsIgnoreCase("desconectarse")){
					//int k = ServidorReversi.clientes.indexOf(this);
					JOptionPane.showMessageDialog(null, "Te has desconectado");
					PanelDeInformacionOeste.habilitarPanelOeste();
					detenerHilo();
					
				}else if(datos.get(0).equalsIgnoreCase("borrar")){
					//int k = ServidorReversi.clientes.indexOf(this);
					PanelDeInformacionOeste.habilitarPanelOeste();
					JOptionPane.showMessageDialog(null, "Tu cuenta ha sido eliminada");
					detenerHilo();
					//socket.close();
				}
				

			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
